/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.agi.ia.kohonen;

/**
 *
 * @author renatogrosz
 */
public class Neuron implements Dados {
    
    private double[][] peso;
    private double[][] distancia;
    
    double euclidiana;
    
    private Tamanho tamanho;    
    
    private double fatorAtualizacao;
    Neuron(Tamanho t){
        peso=new double[t.x][t.y];
        distancia=new double[t.x][t.y];
        this.tamanho=t;
        fatorAtualizacao=1;
    }
    
    /**
     * Calcula a distancia euclidiana entre o peso e a entrada
     * @param entrada 
     */
    void calcularEntrada(double[][] entrada){
        int i,j;
        double d;
        euclidiana=0;
        
        for(i=0;i<tamanho.y;i++){
            for(j=0;j<tamanho.x;j++){
                d=entrada[i][j]-peso[i][j];                
                distancia[i][j]=d;                
                euclidiana+=(d*d);
            }
        }
    }
    
    /**
     * Utiliza a distancia euclidiana para atualizar o peso
     * @param fator 
     */
    void atualizar(double fator){
        int i,j;
        double f;
        f=fator * fatorAtualizacao;
        for(i = 0;i <tamanho.y ; i++){
            for(j = 0; j < tamanho.x; j++){
                peso[i][j]+=f * distancia[i][j];
            }
        }
        euclidiana=euclidiana*(1 - f);
    }
    
    
    
    
    
    @Override
    public Tamanho getTamanho() {
        return(tamanho);
    }

    @Override
    public double[][] getDados() {
        return(peso);        
    }
    
    
    public void setFatorAtualizacao(double fatorAtualizacao){
        if(fatorAtualizacao<=0){
            throw new IllegalArgumentException("Fator atualizacao nao poder zer zero ou menor");
        }
        this.fatorAtualizacao=fatorAtualizacao;
    }
}
